﻿using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

namespace Devonline.Identity;

/// <summary>
/// 机密, 密钥容器, 字符串类型的默认实现
/// </summary>
[Table("secret"), DisplayName("密钥")]
public class Secret : Secret<string> { }

/// <summary>
/// 机密, 密钥容器
/// 适用于 IdentityType 为: User, Role, Group, Level 的情况下, 保存对应的密钥
/// 其余 IdentityType 类型不适用
/// 当 IdentityType != User 时, 角色, 组织和级别的 SecretKey 将同时由其所有用户公钥加密保存一份, 以便于用户可以使用自己的私钥, 解密并获取所属角色, 组织和级别的数据
/// 此时只保存所属角色, 组织和级别的 SecretKey 由当前用户公钥加密的密文
/// 特权用户由所有用户 SecretKey 的密钥备份, 以便于特权用户可以在用户忘记密码时帮助用户恢复数据
/// </summary>
/// <typeparam name="TKey"></typeparam>
[Table("secret"), DisplayName("密钥")]
public class Secret<TKey> : EntitySetWithCreateAndUpdate<TKey> where TKey : IConvertible
{
    /// <summary>
    /// 密钥所有者编号
    /// </summary>
    [Column("owner_id"), DisplayName("密钥所有者编号"), Required, MaxLength(36)]
    public virtual TKey OwnerId { get; set; }
    /// <summary>
    /// 密钥所属类型 IdentityType 枚举值
    /// </summary>
    [Column("identity_type", TypeName = "VARCHAR(16)"), DisplayName("密钥所属类型"), DefaultValue(IdentityType.User)]
    public virtual IdentityType IdentityType { get; set; }
    /// <summary>
    /// 字符编码算法
    /// </summary>
    [Column("character_encoding_algorithm", TypeName = "VARCHAR(16)"), DisplayName("字符编码算法"), DefaultValue(EncryptionAlgorithm.Base64)]
    public virtual EncryptionAlgorithm CharacterEncodingAlgorithm { get; set; }
    /// <summary>
    /// 哈希算法
    /// </summary>
    [Column("hash_algorithm", TypeName = "VARCHAR(16)"), DisplayName("哈希算法"), DefaultValue(ValidationAlgorithm.HMACSHA256)]
    public virtual ValidationAlgorithm HashAlgorithm { get; set; }
    /// <summary>
    /// 对称加密算法
    /// </summary>
    [Column("symmetric_algorithm", TypeName = "VARCHAR(16)"), DisplayName("对称加密算法"), DefaultValue(SymmetricAlgorithm.AES_256_CBC)]
    public virtual SymmetricAlgorithm SymmetricAlgorithm { get; set; }
    /// <summary>
    /// 非对称加密算法
    /// </summary>
    [Column("asymmetric_algorithm", TypeName = "VARCHAR(16)"), DisplayName("非对称加密算法"), DefaultValue(EncryptionAlgorithm.RSA)]
    public virtual EncryptionAlgorithm AsymmetricAlgorithm { get; set; }
    /// <summary>
    /// 非对称密钥长度, 默认 2048 位
    /// </summary>
    [Column("asymmetric_secret_length"), DisplayName("非对称密钥长度"), DefaultValue(2048)]
    public virtual int AsymmetricSecretLength { get; set; }
    /// <summary>
    /// 哈希值, 保存为明文, 用户密钥的明文签名, 用于校验用户密钥解密后的正确性
    /// </summary>
    [Column("hash_code"), DisplayName("哈希值"), MaxLength(32)]
    public virtual byte[] HashCode { get; set; }
    /// <summary>
    /// 对称算法密钥, 此密钥是加密用户数据的关键密钥, 保存为密文, 由用户公钥加密, 用户私钥解密
    /// </summary>
    [Column("secret_key"), DisplayName("密钥"), MaxLength(256)]
    public virtual byte[] SecretKey { get; set; }
    /// <summary>
    /// 非对称算法公钥, 用于加密用户密钥, 保存为明文, 密钥长度 2048 位, 256 字节
    /// </summary>
    [Column("public_key"), DisplayName("公钥"), MaxLength(256)]
    public virtual byte[] PublicKey { get; set; }
    /// <summary>
    /// 非对称算法私钥, 用于取得用户授权后, 解密用户密钥, 保存为密文, 由用户自有密码加密
    /// </summary>
    [Column("private_key"), DisplayName("私钥"), MaxLength(512)]
    public virtual byte[] PrivateKey { get; set; }
    /// <summary>
    /// 预留的校验信息, 用于重置用户密码时, 校验客户身份, 由用户密钥加密保存为密文
    /// </summary>
    [Column("check_information"), DisplayName("校验信息"), MaxLength(256)]
    public virtual string CheckInformation { get; set; }
}